import json
import requests


# 请替换XXXXXXXXXX为您的 APIpassword, 获取地址：https://console.xfyun.cn/services/bmx1
api_key = "Bearer AigHMUBVsFiSZsVzMdfP:RaJRsEtuUeNnevWnbPZW"
url = "https://spark-api-open.xf-yun.com/v2/chat/completions"

# 请求模型，并将结果输出
def get_dance_action(message):
    # 初始化请求体
    data = {
        "max_tokens": 3890,
        "top_k": 4,
        "temperature": 1.2,
        "messages": [
            {
                "role": "system",
                "content": "需基于用户输入的舞蹈或音乐的相关需求（如 \"芭蕾风格的手臂伸展动作\"\"指定的歌曲的编舞\"），生成多个包含5 个肢体动作参数 + 1 个时间参数的结构化 JSON 指令，确保指令可直接被舞蹈动作解析系统识别，可以形成一个完整的舞蹈，无格式错误、无参数无效、无字段缺失问题。{\n  \"left_arm\": 90,\n  \"right_arm\": -45.5,\n  \"left_leg\": 30,\n  \"right_leg\": 0,\n  \"head\": 15,\n  \"duration\": 2.3\n}说明：左臂水平上举 90°、右臂向后摆 45.5°、左腿微屈 30°、右腿伸直（0°）、头部向右摆 15°，整套动作持续 2.3 秒，参数符合物理极限，语法无错误。"
            },
            {
                "role": "user",
                "content": message[-1]["content"] if message else "请在此处输入你的问题!!!"
            }
        ],
        "model": "x1",
        "tools": [
            {
                "web_search": {
                    "search_mode": "deep",
                    "enable": True
                },
                "type": "web_search"
            }
        ]
    }
    data["stream"] = True
    header = {
        "Authorization": api_key,
        "Content-Type": "application/json"
    }
    
    full_response = ""  # 存储返回结果
    response = requests.post(url=url, headers=header, json=data, stream=True)
    response.encoding = "utf-8"
    
    for line in response.iter_lines(decode_unicode=True):
        if line:
            decoded_line = line.decode('utf-8') if isinstance(line, bytes) else line
            if '[DONE]' not in decoded_line:
                try:
                    # 处理数据前缀
                    if decoded_line.startswith('data: '):
                        json_str = decoded_line[6:]  # 去掉 "data: " 前缀
                    else:
                        json_str = decoded_line
                    
                    chunk = json.loads(json_str)
                    if 'choices' in chunk and len(chunk['choices']) > 0:
                        delta = chunk['choices'][0]['delta']
                        if 'content' in delta and delta['content']:
                            content = delta["content"]
                            print(content, end="", flush=True)  # 实时输出内容
                            full_response += content
                except json.JSONDecodeError:
                    # 忽略无法解析的行
                    continue
                except Exception as e:
                    # 忽略其他解析错误，继续处理下一帧
                    continue
    
    print()  # 输出换行，使后续输出更清晰
    return full_response

# 新增get_answer函数以匹配main.py中的导入需求
def get_answer(messages):
    return get_dance_action(messages)

# 管理对话历史，按序编为列表
def getText(text, role, content):
    jsoncon = {}
    jsoncon["role"] = role
    jsoncon["content"] = content
    text.append(jsoncon)
    return text


# 获取对话中的所有角色的content长度
def getlength(text):
    length = 0
    for content in text:
        temp = content["content"]
        leng = len(temp)
        length += leng
    return length


# 判断长度是否超长，当前限制8K tokens
def checklen(text):
    while (getlength(text) > 11000):
        del text[0]
    return text


# 主程序入口
if __name__ == '__main__':
    # 系统提示词，定义舞蹈动作JSON格式
    system_prompt = """需基于用户输入的舞蹈或音乐的相关需求（如 "芭蕾风格的手臂伸展动作""指定的歌曲的编舞"），生成多个包含5 个肢体动作参数 + 1 个时间参数的结构化 JSON 指令，确保指令可直接被舞蹈动作解析系统识别，可以形成一个完整的舞蹈，无格式错误、无参数无效、无字段缺失问题。{
  "left_arm": 90,
  "right_arm": -45.5,
  "left_leg": 30,
  "right_leg": 0,
  "head": 15,
  "duration": 2.3
}说明：左臂水平上举 90°、右臂向后摆 45.5°、左腿微屈 30°、右腿伸直（0°）、头部向右摆 15°，整套动作持续 2.3 秒，参数符合物理极限，语法无错误。"""

    # 对话历史存储列表
    chatHistory = []
    
    # 添加系统提示词
    getText(chatHistory, "system", system_prompt)
    
    # 循环对话轮次
    while True:
        # 等待控制台输入
        user_input = input("\n请输入舞蹈动作需求（输入'退出'结束程序）:")
        
        if user_input == "退出":
            print("程序已退出")
            break
            
        # 构建消息历史
        question = checklen(getText(chatHistory, "user", user_input))
        
        # 开始输出模型内容
        print("生成的舞蹈动作指令:")
        response = get_dance_action(question)
        
        # 将助手回复添加到对话历史中
        getText(chatHistory, "assistant", response)